perm filename TYPE30.SAI[XGP,BGB] blob sn#023232 filedate 1973-02-06 generic text, type T, neo UTF8
00100	ENTRY DOTDD,SHOWDD,CLRDD,ERASDD,STRDD,AIDD,AVDD;
00200	BEGIN	"TYPE31"
00300		REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
00400		INTERNAL SAFE INTEGER ARRAY DDBUF[1:480*18+2];
00500		INTEGER DDPTR,DDBIT;
00600		INTERNAL INTEGER SAVING;
00700		SAFE INTEGER ARRAY FLIPS[1:500];
00800		INTEGER FLIPTR;
00900	INTERNAL PROCEDURE CLRDD (INTEGER CHAN);
01000	BEGIN	"CLRDD"
01100		INTEGER LINE,LINEWD,COLCHN;
01200	α RESET GRAPHICS COMMAND WORDS TO ALL ZEROES;
01300		DDBUF[1]	←	2;
01400		ARRBLT(DDBUF[2],DDBUF[1],480*18);
01500	α RESET COLUMN,COLUMN,CHANNEL WORDS TO 1,1,0;
01600		COLCHN	←	'002004003324;
01700		DPB(CHAN,POINT(8,COLCHN,23));
01800		FOR DDPTR←2 STEP 18 UNTIL 2+18*479 DO
01900		DDBUF[DDPTR]	←	COLCHN;
02000	α RESET EXECUTE, LINE SELECT COMMAND WORDS;
02100		FOR LINE←0 STEP 1 UNTIL 479 DO
02200	BEGIN	"ROWS"
02300		LINEWD	←	'0454;
02400		DPB(LINE   ,POINT(4,LINEWD,23));
02500		DPB(LINE%16,POINT(5,LINEWD,15));
02600		DDPTR	←	((LINE LAND 3)*120 + LINE%4)*18 + 1;
02700		DDBUF[DDPTR]←	LINEWD;
02800	END	"ROWS";
02900	α RESET THE FIRST AND THE LAST TWO COMMAND WORDS;
03000		DDPTR	←	480*18;
03100		DDBUF[1]←	DDBUF[1] LOR '116000001454;
03200		DDBUF[DDPTR+1]←	'000004010334;
03300		DDBUF[DDPTR+2]←	0;
03400	END	"CLRDD";
     

00100	INTERNAL PROCEDURE DOTDD (INTEGER X,Y);
00200	BEGIN	"DOTDD"
00300		INTEGER PTR;
00400		X	←	(0 MAX X) MIN 511;
00500		Y	←	(0 MAX Y) MIN 479;
00600		DDPTR	←	((Y LAND 3)*120 + (Y%4))*18 + (X%32) + 3;
00700		DDBIT	←	X LAND '37;
00800		PTR ← POINT(1,DDBUF[DDPTR],DDBIT);
00900		IF SAVING ∧ 0=LDB(PTR) THEN FLIPS[FLIPTR←FLIPTR+1]←PTR;
01000		DPB(1,PTR);
01100	END	"DOTDD";
01200	
01300	INTERNAL PROCEDURE DITDD (INTEGER X,Y);
01400	BEGIN	"DITDD"
01500		INTEGER PTR;
01600		X	←	(0 MAX X) MIN 511;
01700		Y	←	(0 MAX Y) MIN 479;
01800		DDPTR	←	((Y LAND 3)*120 + (Y%4))*18 + (X%32) + 3;
01900		DDBIT	←	X LAND '37;
02000		PTR ← POINT(1,DDBUF[DDPTR],DDBIT);
02100		IF SAVING ∧ 1=LDB(PTR) THEN FLIPS[FLIPTR←FLIPTR+1]←PTR;
02200		DPB(0,PTR);
02300	END	"DITDD";
02400	
02500	INTERNAL PROCEDURE UNDO;
02600	BEGIN
02700		INTEGER PTR;
02800		WHILE FLIPTR≠0 DO 
02900	⊂ 	PTR←FLIPS[FLIPTR];
03000		IF LDB(PTR) THEN
03100		DPB(0,PTR) ELSE DPB(1,PTR);
03200		FLIPTR←FLIPTR-1;⊃;
03300	END;
03400	
03500	INTERNAL PROCEDURE SHOWDD;
03600	QUICK_CODE "SHOWDD"
03700		INTEGER T1,T2;
03800		MOVEI	11,8642;
03900		MOVEM	11,T2;
04000		MOVE	11,DDBUF;
04100		HRRZM	11,T1;
04200		'715000000000 3,T1;
04300	END	"SHOWDD";
     

00100	INTERNAL PROCEDURE LINEDD (INTEGER X1,Y1,X2,Y2);
00200	BEGIN	"LINEDD"
00300		REAL DX,DY,X,Y;
00400		INTEGER I,N;
00500		DX	←	X2-X1;
00600		DY	←	Y2-Y1;
00700		N	←	ABS(DX) MAX ABS(DY);
00800		DX	←	DX/N;
00900		DY	←	DY/N;
01000		DOTDD(X←X1,Y←Y1);
01100		FOR I←2 STEP 1 UNTIL N DO
01200		DOTDD(X←X+DX,Y←Y+DY);
01300		DOTDD(X2,Y2);
01400	END	"LINEDD";
01500		INTEGER BEAMX,BEAMY;
01600	INTERNAL PROCEDURE AIDD (INTEGER X,Y);
01700	BEGIN	"AIDD"
01800		BEAMX	←	X;
01900		BEAMY	←	Y;
02000	END	"AIDD";
02100	
02200	INTERNAL PROCEDURE AVDD (INTEGER X,Y);
02300	BEGIN	"AVDD"
02400		LINEDD(BEAMX,BEAMY,X,Y);
02500		BEAMX	←	X;
02600		BEAMY	←	Y;
02700	END	"AVDD";
     

00100	α ERASE THE DATA DISC'S SCREEN;
00200	INTERNAL PROCEDURE ERASDD (INTEGER CHAN);
00300	BEGIN
00400	INTEGER COLCHN,X1,X2,X3;
00500		COLCHN ← '136004301324;
00600		DPB(CHAN,POINT(8,COLCHN,23));
00700		X1←0;
00800	START_CODE "ERASDD"
00900		INTEGER T1,T2;
01000		LABEL L;
01100		MOVEI	11,COLCHN;
01200		MOVEM	11,T1;
01300		MOVEI	11,2;
01400		MOVEM	11,T2;
01500	L:	'715000000000 3,T1;
01600	END	"ERASDD";
01700	END;
     

00100	α DISPLAY A STRING ON CHANNEL 36;
00200	INTERNAL PROCEDURE STRDD (INTEGER X,Y; STRING STR);
00300	BEGIN	"STRDD"
00400		INTEGER SIZ,I;
00500		SIZ	←	LENGTH(STR);
00600		IF SIZ=0 THEN RETURN;
00700		SIZ	←	(IF SIZ MOD 5 THEN 1 ELSE 0) + SIZ%5;
00800	BEGIN	"DDBLK"
00900		INTEGER ARRAY DDBUF[-1:SIZ+2+10];
01000		INTEGER FNLINE,COLCHN;
01100	α ASSEMBLE THE FUNCTION AND LINE SELECT WORD;
01200		FNLINE	←	'1454;
01300		DPB('66,   POINT(6,FNLINE, 7));
01400		DPB(Y%16,  POINT(5,FNLINE,15));
01500		DPB(Y,     POINT(4,FNLINE,23));
01600		DDBUF[-1]←	FNLINE;
01700	α ASSEMBLE THE COLUMN AND CHANNEL SELECT WORD;
01800		COLCHN	←	'3324;
01900		DPB(1,     POINT(8,COLCHN, 7));
02000		DPB(X DIV 6,  POINT(8,COLCHN,15));
02100		DPB('35, POINT(8,COLCHN,23));
02200		DDBUF[0]←	COLCHN;
02300	α PACK THE STRING INTO TEXT COMMAND WORDS;
02400		FOR I←1 STEP 1 UNTIL SIZ-1 DO
02500	BEGIN	"PACK"
02600		DDBUF[I]←	CVASC(STR) LOR 1;
02700		STR	←	STR[6 TOO ∞];
02800	END	"PACK";
02900		DDBUF[SIZ]←	CVASC(STR) LOR 1;
03000		DDBUF[SIZ+1]←	'000004010034;
03100		DDBUF[SIZ+2]←	0;
03200	α DISPLAY DD BUFFER;
03300	QUICK_CODE
03400		INTEGER T1,T2;
03500		MOVE	11,SIZ;
03600		ADDI	11,4;
03700		MOVEM	11,T2;
03800		MOVE	11,DDBUF;
03900		HRRZM	11,T1;
04000		'715000000000 3,T1;
04100		HRRZ	11,@DDBUF;
04200		TRC	11,'010000;
04300		HRRM	11,@DDBUF;
04400		'715000000000 3,T1;
04500	END;
04600	END	"DDBLK";
04700	END	"STRDD";
04800	END	"TYPE31";